////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxbpscst12.h
/// @brief bpscst12 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CAMXBPSCST12_H
#define CAMXBPSCST12_H

#include "camxispiqmodule.h"

// Common library includes
#include "iqcommondefs.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

/// @brief CST register Configuration
struct BPSCST12RegCmd
{
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH0_COEFF_CFG_0   channel0CoefficientConfig0; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH0_COEFF_CFG_1   channel0CoefficientConfig1; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH0_OFFSET_CFG    channel0OffsetConfig;       ///< Channel 0 Offset Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH0_CLAMP_CFG     channel0ClampConfig;        ///< Channel 0 Clamp Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH1_COEFF_CFG_0   channel1CoefficientConfig0; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH1_COEFF_CFG_1   channel1CoefficientConfig1; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH1_OFFSET_CFG    channel1OffsetConfig;       ///< Channel 0 Offset Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH1_CLAMP_CFG     channel1ClampConfig;        ///< Channel 0 Clamp Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH2_COEFF_CFG_0   channel2CoefficientConfig0; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH2_COEFF_CFG_1   channel2CoefficientConfig1; ///< Channel 0 Coefficient Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH2_OFFSET_CFG    channel2OffsetConfig;       ///< Channel 0 Offset Config
    BPS_BPS_0_CLC_COLOR_XFORM_COLOR_XFORM_CH2_CLAMP_CFG     channel2ClampConfig;        ///< Channel 0 Clamp Config
} CAMX_PACKED;

CAMX_END_PACKED

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief BPS CST 12 Class Implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class BPSCST12 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create BPSCST12 Object
    ///
    /// @param  pCreateData Pointer to the BPSCST12 Creation
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        BPSModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Execute process capture request to configure module
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~BPSCST12
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~BPSCST12();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// BPSCST12
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BPSCST12();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ValidateDependenceParams
    ///
    /// @brief  Validate the input configuration from app
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResult Indicates if the input is valid or invalid
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult ValidateDependenceParams(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check to see if the Dependence Trigger Data Changed
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return TRUE if dependence is meet
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Calculate the Register Value
    ///
    /// @param  pInputData Pointer to the CST Module Input data
    ///
    /// @return CamxResult Indicates if interpolation and configure registers was success or failure
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConfigureRegisters
    ///
    /// @brief  Configure CST registers
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID ConfigureRegisters();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateBPSInternalData
    ///
    /// @brief  Update BPS internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateBPSInternalData(
        const ISPInputData* pInputData
        ) const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Create the Command List
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// InitRegValues
    ///
    /// @brief  Initialize registers with known set of values
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE VOID InitRegValues();

    BPSCST12(const BPSCST12&)            = delete;     ///< Disallow the copy constructor
    BPSCST12& operator=(const BPSCST12&) = delete;     ///< Disallow assignment operator

    CST12InputData                  m_dependenceData;  ///< Dependence Data for this Module
    BPSCST12RegCmd                  m_regCmd;          ///< Register list for CST module
    cst_1_2_0::chromatix_cst12Type* m_pChromatix;      ///< Pointer to tuning mode data
};

CAMX_NAMESPACE_END

#endif // CAMXBPSCST12_H
